package miguel.seriesly;

import miguel.seriesly.R;

import miguel.api.AuthToken;
import miguel.api.UserEstado;
import miguel.api.UserPermisos;
import miguel.utils.Prefs;
import miguel.utils.SeriesLySQLiteHelper;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.res.Configuration;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.EditText;
import android.widget.TextView;

public class AndroidSeriesLyActivity extends Activity implements ServiceUpdateUIListener {
	public static final String TAG = "SeriesLy";
	private SharedPreferences prefs;
	public static SeriesLySQLiteHelper sqlHelper;
	
	private TryLogin tryLogin = null;
	
	@Override
	public void onConfigurationChanged(Configuration newConfig) {
		super.onConfigurationChanged(newConfig);
	}
	
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);        
        setContentView(R.layout.main);
        
        //Cargamos el mensaje de desconectado
        TextView lblEstado = (TextView) findViewById(R.id.lblEstado);
        lblEstado.setText("");
        
        //Obtenemos las preferencias
        prefs = getSharedPreferences(AndroidSeriesLyActivity.TAG,Context.MODE_PRIVATE);
        
        //Obtenemos el manejador de la base de datos
        sqlHelper = new SeriesLySQLiteHelper(this, "DB_SeriesLy", null, 1);
        
        String loginAuto = prefs.getString("loginAuto", "false");
        String userName = prefs.getString("userName", "");
        String userPassword = prefs.getString("userPassword", "");
        
        //Cargamos por defecto los botones de usuario y contraseña
        EditText editTextUserName = (EditText) findViewById(R.id.txtUsuario);
    	editTextUserName.setText(userName);
    	EditText editTextPassword = (EditText) findViewById(R.id.txtPassword);
    	editTextPassword.setText(userPassword);
        
        final Button btnReintentarConectar = (Button) findViewById(R.id.btnIniciarSesion);
        btnReintentarConectar.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
            	EditText editTextUserName = (EditText) findViewById(R.id.txtUsuario);
            	String userName = editTextUserName.getText().toString();
            	EditText editTextPassword = (EditText) findViewById(R.id.txtPassword);
            	String password = editTextPassword.getText().toString();
        		
            	new TryLogin().execute(new String[] {userName,password, "false"});
            }
        });
        
        if(loginAuto.equals("true")) {
        	//Intentamos conectarnos
        	if(tryLogin == null) {
	        	tryLogin = new TryLogin();
	        	tryLogin.execute(new String[] {userName,userPassword, "true"});
        	}
        }
    }
    
    private void goToMenu() {
    	Intent intent =new Intent();
    	intent.setClass(this, PantallaMenu.class);
        startActivity(intent);
        finish(); //Terminamos esta actividad
    }
    
    private void mostrarMenuAceptarPermisos() {
    	TextView lblEstado = (TextView) findViewById(R.id.lblEstado);
    	//Si no logueado
		lblEstado.setText("Error al conectar");
    	
    	AlertDialog.Builder builder = new AlertDialog.Builder(AndroidSeriesLyActivity.this);
		builder.setMessage("La aplicación necesita permisos para acceder a tus datos, ¿Los quieres conceder?")
		       .setCancelable(false)
		       .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
		           public void onClick(DialogInterface dialog, int id) {
		           		
		        	   //Tenemos que aceptar los permisos
		        	   Context c = AndroidSeriesLyActivity.this;
		        	   UserPermisos.aceptarPermisosUserToken(c);
		        	   
		        	   TextView lblEstado = (TextView) findViewById(R.id.lblEstado);
		        	   lblEstado.setText("Aceptando permisos...");
		        	   
		        	   //Ocultamos la ventana
		        	   dialog.cancel();
		        	   
		        	   if(UserEstado.isLoggedIn(c)) {
		        		   //Nos ponemos como logueados
		        		   Prefs.put(AndroidSeriesLyActivity.this, "logged_in", true);
		        		   //Mostramos el menú
		        		   goToMenu();
		        	   }
		        	   
		               
		           }
		       })
		       .setNegativeButton("No", new DialogInterface.OnClickListener() {
		           public void onClick(DialogInterface dialog, int id) {
		                dialog.cancel();
		           }
		       });
		builder.show();
		
		
    }
    
    private class TryLogin extends AsyncTask<String, Void, Void> {
		
		boolean ok = false;
		boolean aceptarPermisos = false;
		ProgressDialog pd;
		
		//Método que se hace en segundo plano (realizar la autentificación)
		@Override
		protected Void doInBackground(String... params) {
			String userName = params[0];
			String userPassword = params[1];
			boolean autoconectar = params[2].equals("True");
			
			Context c = AndroidSeriesLyActivity.this;
			
			Prefs.put(c, "lg_login", userName);
			Prefs.put(c, "lg_pass", userPassword);

			AuthToken.getAuthToken(c);
		
			String userToken = UserPermisos.getUserToken(c);
			
			String regexPermisos = "document.location";
			if(userToken.contains(regexPermisos)) {
				aceptarPermisos = true;
			}
			
			ok = UserEstado.isLoggedIn(c);
			
			//Si nos hemos logueado pulsando el boton de conectar (es decir, no automáticamente al abrir la aplicación)
			if(ok && !autoconectar) {
				CheckBox chkAutoconectar = (CheckBox) findViewById(R.id.chkAutoconectar);
				//Si queremos que nos autoconectemos la siguiente vez
				if(chkAutoconectar.isChecked()) {
					prefs.edit();
					SharedPreferences.Editor editor = prefs.edit();
					editor.putString("userName",userName);
					editor.putString("userPassword", userPassword);
					editor.putString("loginAuto", "true");
					editor.commit();
				}
			}
			
			return null;
		}

		//Método que se llama al terminal doInBackground
		@Override
		protected void onPostExecute(Void result) {
			//Si está cargado el ProgressBar lo descargamos
			if(pd != null) {
				pd.dismiss();
				pd = null;
			}
			
			TextView lblEstado = (TextView) findViewById(R.id.lblEstado);
			Prefs.put(AndroidSeriesLyActivity.this, "logged_in", ok);
			if(ok) {
				//Si logueado
				lblEstado.setText("Conectado");
				
				//Cargamos la ventana del menu
				goToMenu();
			} else {
				if(aceptarPermisos) {
					//mostrarMenuAceptarPermisos();
					mostrarMenuAceptarPermisos();
				} else {
					//Si no logueado
					lblEstado.setText("Error al conectar");
				}
			}
			
			super.onPostExecute(result);
		}

		//Método que se llama al principio de la ejecución
		@Override
		protected void onPreExecute() {
			//Inicializamos el ProgressDialog
			pd = new ProgressDialog(AndroidSeriesLyActivity.this, R.style.FondoTransparente);
			pd.setTitle(R.string.espere);
			pd.setMessage(getString(R.string.conectando));
			pd.setCancelable(false);
			pd.show();
			
			//Quitamos el mensaje de desconectado
			TextView lblEstado = (TextView) findViewById(R.id.lblEstado);
	        lblEstado.setText("");

			super.onPreExecute();
		}

	}

	@Override
	public void update(int count) {
		// TODO Auto-generated method stub
		
	}
}